#!/usr/bin/python
# -*-coding:UTF-8 -*-

# ========================
# @Time  : 2021/2/1
# @Author: Sunny
# ========================

import unittest
from ddt import ddt,data



# #第三方模块ddt装饰类原理
# @ddt   #等同于 TestLoginCase=ddt(TestLoginCase)
# class TestLoginCase(unittest.TestCase):
#     pass
#
# #cls.__dict__ #查看类里面的所有属性,以字典键值对的方式返回,加上item可以将每组数据转换为列表嵌套元组
# #类里面的方法也是属于类的属性，属于可调用的额属性
# class dog:
#     def __init__(self):
#         self.name = 18
#
#     def read(self):
#         print(f'{self.name}会读书')
# print(dog.__dict__.items())



#--------------------------------------类装饰器---------------------------------
# #自定义可以装饰类的装饰器
# def class_decorate(cls):
#     cls.name ='musen'
#     cls.age = 18
#     return cls
#
#
# @class_decorate  #MyTest=class_decorate(MyTest)
# class MyTest:
#     pass
#
# @class_decorate
# class MyClass:
#     pass

# print(MyTest.name)
# print(MyTest.age)
# print(MyTest.__dict__)


#------------------------------类装饰器二和（统计装饰器使用过的次数）----------------------------------------
#用函数的方式写类装饰器,并且统计装饰器使用过的次数
count ={}
def doc(func):
    """
    :param func: 接收被装饰的函数/类
    :return:
    """
    count[func] = 0
    def wrapper(*args,**kwargs):

        #调用原功能函数
        count[func]+=1
        #func(*args,**kwargs)   #这里是调用了类，但是没有返回对象，所以外层被装饰的类无法创建对象，或者说创建的对象为空
        return func(*args, **kwargs)    #因此采用函数的方式写装饰器，一定要return类
    return wrapper

@doc           #MyTestCase=doc(MyTestCase)
class MyTestCase:
    pass

print()
res = MyTestCase()
res1 = MyTestCase()
res2 = MyTestCase()
print(res)
print(count)